package com.xiaoying.server.publish.utils;

import java.text.DecimalFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

public abstract class CommonHelper {
       
    private static Log log = LogFactory.getFactory().getInstance(CommonHelper.class);
    public static DecimalFormat dcmFmt = new DecimalFormat("0.00");	
    
    public static String APPPATH;
    
    
    /**
     * 判断是否是主键冲突
     * @param errorStr
     *            Dao 返回的错误字符串
     * @return boolean true 数据重复错误
     */
    public static boolean isDbDataRepeatErr(String errorStr) {
        boolean result = false;
        // 定义错误字符串长度
        int errorLength = 5;
        String error2 = getExceptionNO(errorStr, errorLength);
        // 定义数据重复的代码
        String repeatError = "00001";
        if (repeatError.equals(error2)) {
            result = true;
        }
        return result;
    }
    
    /**
     * 根据错误字符串，获取oracle的错误号
     * @param length length
     * @param errorStr
     *            错误字符串 length 该数据库错误字符串的长度
     * @return 5位的错误号
     */
    public static String getExceptionNO(String errorStr, int length) {
        String oraError = "ORA-";
        // 获得指定字符的位置
        int intgg = errorStr.indexOf(oraError);
        // 定义返回字符串
        String error2 = "";
        if (intgg >= 0) {
            error2 = errorStr.substring(intgg + 4, intgg + 4 + length);
        }
        return error2;
    }

    /**
     * 转换null为0.0d,主要用于从map中get数据时,避免空指针异常
     * 
     * @param o 对象
     * @return double
     */
    public static double nvlDouble(Object o) {
        double d = 0d;
        if (!CommonHelper.isNullString(nvl(o))) {
            d = Double.parseDouble(o.toString().trim());
        }
        return d;
    }

    /**
     * 转化null为空字串,主要用于从map中get数据时,避免空指针异常
     * 
     * @param o object
     * @return 字符串
     */
    public static String nvl(Object o) {
        return (null != o) ? o.toString() : "";
    }

    /**
     * 判断是否空字符串,如果输入字符串为null或"",返回true,否则返回false
     * 
     * @param s 字符串
     * @return boolean
     */
    public static boolean isNullString(String s) {
        return null == s || s.length() == 0 || "null".equalsIgnoreCase(s);
    }
    /**
     * 取得当前日期 
     * @return Date
     */
    public static Date getSysDate(){
        return Calendar.getInstance().getTime();
    }
    /**
     * 取得当前日期 （yyyyMMdd）
     * @return String yyyyMMdd
     */
    public static String getSysDateYYYYMMDD(){
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
        return sdf.format(getSysDate());
    }
    /**
     * 把日期yyyyMMdd加上days，得到一个days天后的日期，days要是为负数，得到一个days天前的日期
     * 
     * @param yyyyMMdd 格式yyyyMMdd
     * @param days days
     * @return String
     * @throws ParseException
     */
    public static String getAnotherDate(String yyyyMMdd, int days)
        throws ParseException {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
        Date date = sdf.parse(yyyyMMdd);
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        calendar.set(Calendar.DAY_OF_YEAR, calendar.get(Calendar.DAY_OF_YEAR)
            + days);
        return sdf.format(calendar.getTime());
    }
    /**
     * 判断当前系统时间是否小于传入时间
     * 
     * @param date 格式：yyyyMMdd
     * @return boolean true 当前系统时间小于传入时间
     */
    public static boolean isMoreThanSysDate(String date) {
        try {
            SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
            Date a = sdf.parse(date);
            Date s = sdf.parse(CommonHelper.getSysDateYYYYMMDD());
            return a.after(s);
        } catch (ParseException e) {
            log.error(e);
            return true;
        }
    }
    /**
     * 判断传入时间是否超期
     * 
     * @param date 格式：yyyyMMdd
     * @param days 超期时间（天）
     * @return boolean true 超期
     */
    public static boolean isExpires(String date,int days) {
        try {
            SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
            Date a = sdf.parse(CommonHelper.getAnotherDate(date, days));
            Date s = sdf.parse(CommonHelper.getSysDateYYYYMMDD());
            return s.after(a);
        } catch (ParseException e) {
            log.error(e);
            return true;
        }
    }
    /**
     * 根据认证时间去的所属月份
     * @param rzsj 认证时间
     * @return int
     */
    public static int getSsyfByRzsj(String rzsj) {
        try {
            SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
            Calendar cal = Calendar.getInstance();
            //根据“认证时间”确定“所属月份”
            cal.setTime(sdf.parse(rzsj));
            int ssyf = (cal.get(Calendar.YEAR) - 1900) * 16
                    + cal.get(Calendar.MONTH) + 1;
            return ssyf;
        } catch (ParseException e) {
            log.error(e);
            return 0;
        }
    }
    
}
